/**
 * 响应拦截
 * @param {Object} http 
 */
import config from '@/common/config'
let requests = [];
export const responseInterceptors = (vm) => {
	uni.$uv.http.interceptors.response.use(async (response) => {
		uni.hideLoading();
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		const data = response.data
		// 自定义参数
		const custom = response.config?.custom

		if (data.code == 401) {
			if (vm.$store.state.refreshToken) {
				return await doRequest(response); //刷新 token 方法
			} else {
				// 2. H5环境带参数重定向登录页（适配H5路由参数拼接）
				const toLoginPage = (loginParams = {}) => {
					var pages = getCurrentPages();
					var currentPage = pages[pages.length - 1];
					// 基础参数：携带当前页路由（用于登录后返回）
					var baseParams = {};
					if (currentPage?.$route?.fullPath) {
						baseParams['goback'] = currentPage.$route.fullPath;
					}
					// 合并基础参数和自定义参数（自定义参数优先级更高，可覆盖基础参数）
					const finalParams = {
						...baseParams,
						...loginParams
					};

					// #ifdef H5
					// H5环境：处理参数拼接（避免uni路由在H5下的参数丢失问题）
					let queryStr = Object.entries(finalParams)
						.map(([key, val]) =>
							`${encodeURIComponent(key)}=${encodeURIComponent(val)}`)
						.join('&');
					// 拼接完整登录URL（支持hash模式和history模式）
					const fullLoginUrl = queryStr ?
						`${config.loginUrl}?${queryStr}` :
						config.loginUrl;
					// 使用uni.$uv.route重定向，确保H5路由一致性
					uni.$uv.route({
						url: fullLoginUrl,
						type: 'reLaunch',
						success() {
							console.log('重定向登录页成功（H5）');
						},
						fail(err) {
							console.log('重定向登录页失败：', err);
						}
					});
					// #endif
					// #ifndef H5
					// 非H5环境保持原有逻辑
					uni.$uv.route({
						url: config.loginUrl,
						type: 'reLaunch',
						params: finalParams,
					});
					// #endif
				};
				toLoginPage();
				// var pages = getCurrentPages(); // 获取当前页面栈
				// var currentPage = pages[pages.length - 1]; // 获取当前页面
				// var params = {}
				// if (currentPage?.route) {
				// 	params['goback'] = currentPage.route;
				// }
				// console.log(currentPage);
				// uni.$uv.route({
				// 	url: config.loginUrl,
				// 	type: 'reLaunch',
				// 	params: params,
				// })
			}
		}

		if (data.code == 301) {
			uni.$uv.toast('余额不足，请充值！');
			var pages = getCurrentPages(); // 获取当前页面栈
			var currentPage = pages[pages.length - 1]; // 获取当前页面
			var params = {}
			if (currentPage?.$route?.fullPath) {
				params['goback'] = currentPage.$route.fullPath;
			}
			uni.$uv.route({
				url: config.rechargeUrl,
				params: params, // H5下uni.$uv.route会自动拼接参数到URL
				intercept(params, next) {
					// 模拟处理等待
					setTimeout(() => {
						next(true);
					}, 1000)
				}
			})
		}

		if (data.code !== 200) { // 服务端返回的状态码不等于200，则reject()
			// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
			if (custom.toast != false) {
				uni.$uv.toast(data.message || data.msg)
			}

			if (data.code == 202) {
				uni.$uv.toast(data.message || data.msg)
			}
			// 如果需要catch返回，则进行reject
			if (custom?.catch) {
				return Promise.reject(data)
			} else {
				// 否则返回一个pending中的promise
				return new Promise(() => {})
			}
		}
		return data.data || {}

	}, (response) => {
		/*  对响应错误做点什么 （statusCode !== 200）*/
		// console.log(response);
		uni.hideLoading();
		return Promise.reject(response)
	})
	// 刷新 token 方法
	async function doRequest(response) {
		// console.log('执行完成');
		if (!response.config.url.includes("/refreshToken")) {
			var baseUrl = config.baseUrl;
			// #ifdef H5
			baseUrl = '';
			// #endif
			// 也可以直接通过uni.$uv.get发出请求， 注意此处需要写上接口地址
			const reToken = await uni.$uv.http.get(baseUrl + '/api/refreshToken?time=' + new Date().getTime(), {
				custom: {
					refresh: true,
					toast: false,
					catch: true,
				},
			})
			if (reToken && reToken.token) {
				// console.log('执行完成', reToken);
				// 保存token
				vm.$store.state.vuex_token = vm.aes_encrypt(reToken.token);
				vm.$store.state.refreshToken = vm.aes_encrypt(reToken.refreshToken);
				// 已经刷新了token，将所有队列中的请求进行重试
				Promise.all(requests) // 逐个按请求队列顺序重新发起请求
					.catch(err => { // 捕获请求队列里可能产生的接口异常
						console.log('接口抛出错误:', err)
					})
				requests = [];
				return await uni.$uv.http.request(response.config);
			} else {
				vm.$store.state.vuex_token = '';
				vm.$store.state.refreshToken = '';
				if (!response.config.url.includes("/pages/login")) {
					var pages = getCurrentPages(); // 获取当前页面栈
					var currentPage = pages[pages.length - 1]; // 获取当前页面
					var params = {}
					if (currentPage?.route) {
						params['goback'] = currentPage.route;
					}
					uni.$uv.route({
						url: config.loginUrl,
						type: 'reLaunch',
						params: params,
					})
				}

				// const req = function() {
				// 	return new Promise(resolve => {
				// 		resolve(uni.$uv.http.request(response.config))
				// 	})
				// }
				// requests.push(req()) // 请求存入队列
			}
			//  new Promise((resolve) => {
			// 	const fn = () => Promise.resolve(uni.$uv.http.request(response.config))
			// 	requests.push({
			// 		fn,
			// 		resolve
			// 	})
			// })
		}
	}
}